﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using SistemaCenterQuimPost.Control;  //necesario para validar txtMontoFinal y txtObservacio.
using SistemaCenterQuimPost.Plantillas; //necesario para obtener fecha, nombre usuario etc,


namespace SistemaCenterQuimPost.UI
{
    public partial class frmCerrarCaja : SistemaCenterQuimPost.Plantillas.frmPlantillaHijo
    {
        //--------------------ATRIBUTOS------------------------

        private DataSet2 centerQuimDs;
        private DataSet2TableAdapters.CajasTableAdapter cajasTa;
        private DataSet2TableAdapters.IngresosxCajaTableAdapter ingresosDa;

        private int nroCajaAbierta;




        //--------------------CONSTRUCTORES--------------------

        public frmCerrarCaja(int ancho, int alto) //frmCerrarCaja usa tanto Cajero, Administrador y Supervisor.
        //Todos usan diferentes tamaños de ventana. Se recibe este dato al crear.
        {
            InitializeComponent();

            this.Width = ancho;   //se establecen los tamaños d
            this.Height = alto;
            this.MinimumSize = new System.Drawing.Size(ancho, alto); //Se establece el tamaño máximo y mínimo en pixeles.
            this.MaximumSize = new System.Drawing.Size(ancho, alto);


            this.centerQuimDs = new DataSet2(); //inicializacion de atributos que permiten obtener datos de base de datos
            this.cajasTa = new DataSet2TableAdapters.CajasTableAdapter();
            this.ingresosDa = new DataSet2TableAdapters.IngresosxCajaTableAdapter();

            this.nroCajaAbierta = 0;  //se inicializa a un valor arbitrario.


        }

        //--------------------ESTADOS--------------------

        private void frmCerrarCaja_Load(object sender, EventArgs e)
        {
           
        }

        private void estEsperandoMonto()   //estado que representa cuando ingresa a la interface 
        {
            System.Windows.Forms.Control[] controlesHabilitados = { this.txtMontoFinalCaja, this.btnIngresar, this.txtObservacion };
            System.Windows.Forms.Control[] controlesDeshabilitados = { };
            System.Windows.Forms.Control[] controlesVisibles = { };
            System.Windows.Forms.Control[] controlesInvisibles = { this.lblCajaInicial, this.lblVentas, this.lblPagos,this.lblIngresos, this.lblGastos, this.lblDeudores ,this.lblCaja, this.lblExtracciones, this.lblSaldoHaber, this.lblSaldoDebe, this.lblSaldo, this.lblSeparador1, lblError };

            habilitarControles(controlesHabilitados);
            deshabilitarControles(controlesDeshabilitados);
            visibleControles(controlesVisibles);
            invisibleControles(controlesInvisibles);

            lblObservacion.Location = lblCajaInicial.Location; //Se deja el lblObservacion y el txtObservacion la parte superior.
            txtObservacion.Location = new Point(lblObservacion.Location.X + 107, lblObservacion.Location.Y);

            errorProvider1.Clear();

            txtMontoFinalCaja.Focus();

        }

        private void estMostrandoCierre()  //estado una vez que se cierra el formulario. El usuario debe cerrar la interface a traves del boton de ventana.
        {
            System.Windows.Forms.Control[] controlesHabilitados = { };
            System.Windows.Forms.Control[] controlesDeshabilitados = { this.txtMontoFinalCaja, this.btnIngresar, this.txtObservacion };
            System.Windows.Forms.Control[] controlesVisibles = { this.lblCajaInicial, this.lblVentas, this.lblPagos, this.lblIngresos, this.lblGastos, this.lblDeudores, this.lblCaja, this.lblExtracciones, this.lblSaldoHaber, this.lblSaldoDebe, this.lblSaldo, this.lblSeparador1};
            System.Windows.Forms.Control[] controlesInvisibles = {lblError };


            habilitarControles(controlesHabilitados);
            deshabilitarControles(controlesDeshabilitados);
            visibleControles(controlesVisibles);
            invisibleControles(controlesInvisibles);

            lblObservacion.Location = new Point(12, 527);
            txtObservacion.Location = new Point(119, 527);

            errorProvider1.Clear();

            txtMontoFinalCaja.Focus();

        }

        //--------------------METODOS VARIOS--------------------

        public void verificarCajaAbierta()  //Verifica que exista caja y que esté abierta.
        {
            try
            {
                int codUltimaCaja = 0;  //almacenará el código de la última caja, si existe.

                codUltimaCaja = Convert.ToInt32(cajasTa.ScalarQueryCaja()); //busca la ultima caja si hay registros.

                cajasTa.FillByNroCaja(centerQuimDs.Cajas, codUltimaCaja); //obtiene todos los datos de la ultima caja


                if (centerQuimDs.Cajas[0].estado == "A") // si la caja está abierta 
                {
                    this.nroCajaAbierta = centerQuimDs.Cajas[0].nroCaja; //establece el valor del atributo de instancia.

                    this.lblFechaValor.Text = centerQuimDs.Cajas[0].fechaCaja.ToString("d");  //setea los valores de la interface.
                    this.lblTurnoValor.Text = centerQuimDs.Cajas[0].turno;
                    this.lblCajeroValor.Text = getNombreUsuarioCajaAbierta(centerQuimDs.Cajas[0].codUsuarioApertura);

                    this.estEsperandoMonto();  //deja el formulario como debe ser

                    this.Show();  //muestra la interface

                }

                else   //Si existe caja y está cerrada, informamos que no se puede cerrar.
                {
                    MessageBox.Show("No existe ninguna caja abierta que pueda cerrar.", "INFORMES", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
                    this.Close(); //Cerramos el form instanciado y colocado en la coleccion de menu, de esta forma desligamos del menu.
            
                }
            }

            catch (IndexOutOfRangeException)  //excepcion cuando no encuentra registro en la base de datos caja.
            {
                MessageBox.Show("Aún no se han abierto ninguna caja, por lo tanto no puede cerrar ninguna.", "INFORMES", MessageBoxButtons.OK, MessageBoxIcon.Information);

                this.Close(); //Cerramos el form instanciado y colocado en la coleccion de menu, de esta forma desligamos del menu.
            
            
            }

            catch (Exception ex)
            {
                //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }

        private string getNombreUsuarioCajaAbierta(int codUsuarioApertura) //método que obtiene el usuario de una caja abierta.
        {
            DataSet2 UsuariosDs = new DataSet2();
            DataSet2TableAdapters.UsuariosTableAdapter UsuariosDa = new DataSet2TableAdapters.UsuariosTableAdapter();

            try
            {
                UsuariosDa.FillByCodigoUsuario(UsuariosDs.Usuarios, codUsuarioApertura);

                return UsuariosDs.Usuarios[0].nombreUsuario;

            }

            catch (IndexOutOfRangeException)
            {
                return "Usuario ya eliminado.";

            }

            catch (Exception ex)
            {
                //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return "";

            }

        }



        private void btnIngresar_Click(object sender, EventArgs e)
        {
            if (formularioValido())
            {
                try
                {
                    this.cerrarCajaActual();

                    this.establecerInterfaceDeCierre();

                    this.estMostrandoCierre();

                }
                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    //this.Close();
                }

            }else
            {
                informarExistenciaError();
            }
        }

        private void cerrarCajaActual()
        {
            cajasTa.FillByNroCaja(centerQuimDs.Cajas, this.nroCajaAbierta); //obtiene todos los datos de la ultima caja

            double saldo = Convert.ToDouble(this.txtMontoFinalCaja.Text) -  centerQuimDs.Cajas[0].cajaFinal;

            centerQuimDs.Cajas[0].saldo = saldo; //se establece el saldo de la caja.
            centerQuimDs.Cajas[0].estado = "C"; //se establece el estado a cerrado.
            centerQuimDs.Cajas[0].observacion = centerQuimDs.Cajas[0].observacion + "CIERRE: " + (txtObservacion.Text).Trim().ToUpper() + "."; //se añade la observacion a la base de datos
            centerQuimDs.Cajas[0].codUsuarioCierre = obtenerCodUsuarioActual(); //(MARIANO) ASIGNALE EL CODIGO DE USUARIO QUE CORRESPONDA
            cajasTa.Update(centerQuimDs.Cajas); //se actualiza

            MessageBox.Show("La caja se ha cerrado correctamente.", "INFORMES", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void establecerInterfaceDeCierre() //se les concatena el valor correspondiente a los label
        {
            cajasTa.FillByNroCaja(centerQuimDs.Cajas, this.nroCajaAbierta); //obtiene todos los datos de la ultima caja

            this.lblCajaInicial.Text = this.lblCajaInicial.Text + " " + centerQuimDs.Cajas[0].cajaInicial.ToString();
            this.lblVentas.Text = this.lblVentas.Text + " " + centerQuimDs.Cajas[0].ventas.ToString();
            this.lblIngresos.Text = this.lblIngresos.Text + " " + centerQuimDs.Cajas[0].ingresos.ToString();
            this.lblGastos.Text = this.lblGastos.Text + " " + centerQuimDs.Cajas[0].gastos.ToString();
            this.lblCaja.Text = this.lblCaja.Text + " " + centerQuimDs.Cajas[0].cajaFinal.ToString();
            this.lblExtracciones.Text = this.lblExtracciones.Text + " " + centerQuimDs.Cajas[0].extracciones.ToString();
            this.lblDeudores.Text += " " + centerQuimDs.Cajas[0].deudoresxVenta.ToString();
            this.lblPagos.Text += " " + centerQuimDs.Cajas[0].pagos.ToString();

            Double sumaDebe = 0;
            Double sumaHaber = 0;

            sumaDebe = centerQuimDs.Cajas[0].cajaInicial + centerQuimDs.Cajas[0].ventas + centerQuimDs.Cajas[0].ingresos;
            sumaHaber = centerQuimDs.Cajas[0].gastos + centerQuimDs.Cajas[0].cajaFinal + centerQuimDs.Cajas[0].extracciones;

            this.lblSaldoDebe.Text = this.lblSaldoDebe.Text + " " + sumaDebe.ToString();
            this.lblSaldoHaber.Text = this.lblSaldoHaber.Text + " " + sumaHaber.ToString();

            this.lblSaldo.Text = this.lblSaldo.Text + " " + centerQuimDs.Cajas[0].saldo.ToString();

            this.txtObservacion.Text = centerQuimDs.Cajas[0].observacion;


        }



        private bool formularioValido()  //método que valida el formulario
        {
            validarMontoFinal();  //llama al método validar monto final

            validarObservacion(); //llama al método validar observación


            if ((errorProvider1.GetError(txtMontoFinalCaja) == "") && (errorProvider1.GetError(txtObservacion) == ""))
            {
                return true;
            }
            else
            {
                return false;
            }

        }

        private void validarMontoFinal()
        {
            if (txtMontoFinalCaja.Text.Trim() == "")
            {
                errorProvider1.SetError(txtMontoFinalCaja, "Monto Final: el campo se encuentra vacio\n\n");
            }
            else
            {
                errorProvider1.SetError(txtMontoFinalCaja, new ValidarDatos().validarMoneda("Monto Final:", txtMontoFinalCaja.Text));
            }
        }

        private void validarObservacion()  //método que valida el txtObservación.
        {
            try
            {
                cajasTa.FillByNroCaja(centerQuimDs.Cajas, this.nroCajaAbierta); //obtiene todos los datos de la ultima caja

                errorProvider1.SetError(txtObservacion, new ValidarDatos().validarLongitud("Observación:", "CIERRE: " + centerQuimDs.Cajas[0].observacion + txtObservacion.Text, 100));

            }
            catch (Exception ex)
            {
                //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                //this.Close();
            }

        }

        private int obtenerCodUsuarioActual()  //Dato necesario para la apertura de una caja
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getCodUsuario();
        }

        private string obtenerFechaActual()  //Dato necesario para la apertura de una caja.
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getFechaActual();
        }

        private void btnRegistrar_Click(object sender, EventArgs e)
        {
            /*
             //ACTUALIZAMOS LOS CAMPOS DE LA CAJA YA ABIERTA
            centerQuimDs.Cajas[0].codUsuarioCierre = 0; //MARIANO ACA TENER QUE INDICAR EL NUMERO DE USUARIO DE CIERRE
            centerQuimDs.Cajas[0].estado = "C".ToUpper ().Trim ();
            
            if (txtObservacion .Text != "") //solamente acutaliza el campo si se acotó alguna observación
            {
                centerQuimDs.Cajas[0].observacion = centerQuimDs.Cajas[0].observacion + "Cierre: " + txtObservacion.Text;
            }
            cajasDa.Update(centerQuimDs.Cajas);
            MessageBox.Show("Cierre Satisfactorio", "Cierre", MessageBoxButtons.OK, MessageBoxIcon.Information);
             * 
             */
        }

        private void estabaEnBtnRegistrar()
        {
            /*
            if (Math.Round(Convert.ToDecimal(txtMontoFinalCaja.Text.Trim()), 2) > 0) //verifica que el monto final de caja sea positivo
            {
                ultimaCaja = int.Parse(cajasTa.ScalarQueryUltimaCaja().ToString()); //busca la ultima caja
                cajasTa.FillByNroCaja(centerQuimDs.Cajas, ultimaCaja); //busca todos los registros de la ultima caja
                lblCajaInicialValor.Text = centerQuimDs.Cajas[0].cajaInicial.ToString(); //asigna los campos
                lblVentasValor.Text = centerQuimDs.Cajas[0].ventas.ToString();

                ingresosTa.FillByNroCaja(centerQuimDs.IngresosxCaja, ultimaCaja); //se obtienen todos los ingresos del turno
                if (centerQuimDs.Cajas.Rows.Count == 0) // si no hubo ingresos
                {
                    lblIngresoValor.Text = "0";
                }
                else //si hubo ingresos
                {
                    double acumuluador; //creamos un acumulador
                    acumuluador = 0;

                    foreach (DataRow unaFila in centerQuimDs.IngresosxCaja)
                    {
                        acumuluador += Math.Round(Convert.ToDouble(unaFila[2].ToString().Trim()), 2);

                    }
                    lblIngresoValor.Text = acumuluador.ToString();

                }

                lblGastosValor.Text = centerQuimDs.Cajas[0].gastos.ToString();
                lblCajaValor.Text = txtMontoFinalCaja.Text;
                lblExtraccionesValor.Text = centerQuimDs.Cajas[0].extracciones.ToString();
                //cargamos los dos saldos
                lblSaldoHaberValor.Text = (Math.Round(Convert.ToDouble(lblGastosValor.Text.Trim()), 2) + Math.Round(Convert.ToDouble(lblCajaValor.Text.Trim()), 2) + Math.Round(Convert.ToDouble(lblExtraccionesValor.Text.Trim()), 2)).ToString();
                lblSaldoDebeValor.Text = (Math.Round(Convert.ToDouble(lblCajaInicialValor.Text.Trim()), 2) + Math.Round(Convert.ToDouble(lblVentasValor.Text.Trim()), 2) + Math.Round(Convert.ToDouble(lblIngresoValor.Text.Trim()), 2)).ToString();

                //obtenemos saldo final
                lblSaldoValor.Text = (Math.Round(Convert.ToDouble(lblSaldoHaberValor.Text.Trim()), 2) - Math.Round(Convert.ToDouble(lblSaldoDebeValor.Text.Trim()), 2)).ToString();
           
             }
             */
        }

        /*
        private void btnRegistrar_Click(object sender, EventArgs e)
        {
            //ACTUALIZAMOS LOS CAMPOS DE LA CAJA YA ABIERTA
            centerQuimDs.Cajas[0].codUsuarioCierre = 0; //MARIANO ACA TENER QUE INDICAR EL NUMERO DE USUARIO DE CIERRE
            centerQuimDs.Cajas[0].estado = "C".ToUpper ().Trim ();
            centerQuimDs.Cajas[0].cajaFinal = centerQuimDs.Cajas[0].saldo;
            
            if (txtObservacion .Text != "") //solamente acutaliza el campo si se acotó alguna observación
            {
                centerQuimDs.Cajas[0].observacion = centerQuimDs.Cajas[0].observacion + "Cierre: " + txtObservacion.Text;
            }
            cajasTa.Update(centerQuimDs.Cajas);
            MessageBox.Show("Cierre Satisfactorio", "Cierre", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
         * */

    }
}
